﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Collections;
using Proxy;
using System.Web.Services;
using System.Text;
using SIM.Util;

namespace SIM.Geo.UI.Geo
{
    public partial class frmEstructura : PageBase
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                this.rgLista.ClientSettings.Scrolling.ScrollHeight = int.Parse(System.Configuration.ConfigurationManager.AppSettings["listaPrincipalScrollHeight"]);
                string id = Request.Params["id"].ToString();
                this.hidCodigoSondaje.Value = id;
                this.hidDato.Value = id;
                CargarSondaje();
                CargarCombos();
                Listar();
            }

            if (this.hidCodigoSondaje.Value.CompareTo(this.hidDato.Value) != 0)
            {
                this.hidCodigoSondaje.Value = this.hidDato.Value;
                CargarSondaje();
                Listar();
            }
        }

        #region Metodos
        private void CargarSondaje()
        {
            try
            {
                using (SESondajeClient proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                {
                    this.txtNombreSondaje.Enabled = false;
                    var sondaje = proxy.ObtenerSondaje(int.Parse(this.hidCodigoSondaje.Value));
                    if (sondaje != null)
                    {
                        this.txtNombreSondaje.Text = sondaje.NombreDDH;
                        this.hidEstadoSondaje.Value = sondaje.Estado.ToString();
                        this.hidCumplimiento.Value = sondaje.CumplioEstructura.ToString();
                        if (sondaje.Estado.CompareTo((short)enmEstadoSondaje.Finalizado.GetHashCode()) == 0 ||
                            sondaje.CumplioEstructura.CompareTo((short)enmEstadoCumplimiento.Cumplido.GetHashCode()) == 0)
                        {
                            this.ibtnRegistrar.Enabled = false;
                            this.ibtnRegistrar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                            this.ibtnFinalizar.Enabled = false;
                            this.ibtnFinalizar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                        }
                        else
                        {
                            this.ibtnRegistrar.Enabled = true;
                            this.ibtnRegistrar.ToolTip = BUTTON_TOOLTIP_AGREGAR;
                            this.ibtnFinalizar.Enabled = true;
                            this.ibtnFinalizar.ToolTip = BUTTON_TOOLTIP_FINALIZAR;
                        }

                        //Finalizado
                        if (sondaje.Estado.CompareTo((short)enmEstadoSondaje.Finalizado.GetHashCode()) == 0)
                            this.txtEstado.Text = enmEstadoSondaje.Finalizado.ToString();
                        else
                            this.txtEstado.Text = enmEstadoSondaje.Iniciado.ToString();

                        //Cumplimiento
                        if (sondaje.CumplioEstructura.CompareTo((short)enmEstadoCumplimiento.Cumplido.GetHashCode()) == 0)
                            this.txtCumplimiento.Text = enmEstadoCumplimiento.Cumplido.ToString();
                        else
                            this.txtCumplimiento.Text = enmEstadoCumplimiento.Pendiente.ToString();
                    }
                    else
                    {
                        this.txtNombreSondaje.Text = string.Empty;
                        this.hidEstadoSondaje.Value = "0";
                        this.ibtnRegistrar.Enabled = false;
                        this.ibtnRegistrar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                        this.ibtnFinalizar.Enabled = false;
                        this.ibtnFinalizar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                    }
                }
                this.lblTitleModal.Text = "SONDAJE: " + this.txtNombreSondaje.Text;
            }
            catch (Exception ex)
            {

                Logger.Error("frmEstructura:CargarSondaje", ex);
            }
        }

        protected override void Listar()
        {
            try
            {
                using (var proxy = new SEEstructuraClient("BasicHttpBinding_ISEEstructura"))
                {
                    var lista = proxy.BuscarEstructuraPorSondaje1(int.Parse(this.hidCodigoSondaje.Value)).ToList();
                    this.rgLista.DataSource = lista;
                    
                    this.rgLista.DataBind();

                    #region Captura ultimo Hasta
                    //Captura ultimo Hasta y coloca como Desde para registrar nuevo
                    this.hidDesde.Value = "0";
                    if (lista != null && lista.Count > 0)
                    {
                        double hasta = (double)lista.Select(x => x.Hasta).Max();
                        this.hidDesde.Value = hasta.ToString();
                    }
                    #endregion
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmEstructura:Listar", ex);
            }
        }

        private void CargarCombos()
        {
            try
            {
                using (SEGeologoClient proxy = new SEGeologoClient("BasicHttpBinding_ISEGeologo"))
                {
                    this.Bind(this.ddlGeologo, proxy.ObtenerListItem().ToList());
                    this.ddlGeologo.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

                using (SETipoRellenoClient proxy = new SETipoRellenoClient("BasicHttpBinding_ISETipoRelleno"))
                {
                    this.Bind(this.cboTipoRelleno, proxy.ObtenerListItem().ToList());
                    //this.cboTipoRelleno.EnableCheckAllItemsCheckBox = true;                    
                }

                using (SETipoEstructuraClient proxy = new SETipoEstructuraClient("BasicHttpBinding_ISETipoEstructura"))
                {
                    this.Bind(this.ddlEstructura, proxy.ObtenerListItem().ToList());
                    this.ddlEstructura.Items.Insert(0, new ListItem(Constantes.TipoSeleccion.SELECCIONE, TipoDropDownList.Seleccionar.GetHashCode().ToString()));
                }

            }
            catch (Exception ex)
            {

                Logger.Error("frmEstructura:CargarCombos", ex);
            }
        }

        protected override void Limpiar()
        {
            this.hidCodigo.Value = "0";
            this.txtDesde.Value = 0;
            this.txtHasta.Value = 0;
            this.ddlGeologo.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();
            this.ddlEstructura.SelectedValue = TipoDropDownList.Seleccionar.GetHashCode().ToString();

            this.txtFecha.SelectedDate = null;
            this.txtAngulo.Text = string.Empty;
            this.txtDescripcion.Text = string.Empty;

            this.txtDesde.Text = this.hidDesde.Value;
            for (int i = 0; i < this.cboTipoRelleno.Items.Count; i++)
            {
                this.cboTipoRelleno.Items[i].Checked = false;
            }

            OcultarMensaje();
            OcultarMensajeValidacion();
        }

        private void Habilitar(bool estado = true)
        {
            this.txtDesde.Enabled = estado;
            this.txtHasta.Enabled = estado;
            this.ddlGeologo.Enabled = estado;
            this.txtFecha.Enabled = estado;
            this.ddlEstructura.Enabled = estado;
            this.txtAngulo.Enabled = estado;

            this.txtDescripcion.Enabled = estado;
            for (int i = 0; i < this.cboTipoRelleno.Items.Count; i++)
            {
                this.cboTipoRelleno.Items[i].Enabled = estado;
            }

            this.ibtnGuardar.Visible = estado;
        }

        private void MostrarDetalle(int codigoEstructura, enmAccionRealizar accionRealizar)
        {
            try
            {
                this.hidCodigo.Value = codigoEstructura.ToString();
                if (accionRealizar == enmAccionRealizar.Edicion)
                {
                    //Carga detalla de pantalla en modo Edicion
                    this.CargarDatos(int.Parse(this.hidCodigoSondaje.Value), codigoEstructura);
                    Habilitar(true);
                }
                else if (accionRealizar == enmAccionRealizar.Ver)
                {
                    //Carga detalla de pantalla en modo Consulta
                    this.CargarDatos(int.Parse(this.hidCodigoSondaje.Value), codigoEstructura);
                    Habilitar(false);
                }
                else if (accionRealizar == enmAccionRealizar.Nuevo)
                {
                    //Carga detalla de pantalla en modo Nuevo
                    Limpiar();
                    Habilitar(true);
                }

                OcultarMensaje();
                OcultarMensajeValidacion();

                this.mpRegistro.Show();
            }
            catch (Exception ex)
            {

                Logger.Error("frmGeoMecanica:MostrarDetalle", ex);
            }
        }

        private void CargarDatos(int codigoSondaje, int codigoGeomecanica)
        {
            try
            {
                using (var proxy = new SEEstructuraClient("BasicHttpBinding_ISEEstructura"))
                {
                    var item = proxy.ObtenerEstructura(codigoSondaje, codigoGeomecanica);
                    if (item != null)
                    {
                        this.hidCodigo.Value = item.CodigoEstructura.ToString();
                        this.txtDesde.Text = item.Desde.ToString();
                        this.txtHasta.Text = item.Hasta.ToString();
                        this.ddlGeologo.SelectedValue = item.CodigoGeologo.ToString();
                        this.ddlEstructura.SelectedValue = item.CodigoTipoEstructura.ToString();
                        //this.ddlRelleno.SelectedValue = item.CodigoTipoEstructura.ToString();
                        this.txtAngulo.Text = item.Angulo.ToString();

                        if (item.Fecha == null)
                            this.txtFecha.SelectedDate = null;
                        else
                            this.txtFecha.SelectedDate = item.Fecha;
                        this.txtDescripcion.Text = item.Descripcion;

                        //Deshabilita los checkBox
                        for (int i = 0; i < this.cboTipoRelleno.Items.Count; i++)
                        {
                            this.cboTipoRelleno.Items[i].Checked = false;
                        }
                        
                        if (item.EstructuraTipoRelleno != null)
                        {
                            foreach (var detalle in item.EstructuraTipoRelleno)
                            {
                                for (int i = 0; i < this.cboTipoRelleno.Items.Count; i++)
                                {
                                    if (this.cboTipoRelleno.Items[i].Value.CompareTo(detalle.CodigoTipoRelleno.ToString()) == 0)
                                        this.cboTipoRelleno.Items[i].Checked = true;
                                }
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmEstructura:CargarDatos", ex);
            }
        }

        #region Mensajes
        protected override void MostrarMensajeValidacion(string mensaje)
        {
            this.pnlMensajeValidacion.Visible = true;
            this.lblMensajeValidacion.Text = mensaje;
        }

        protected override void OcultarMensajeValidacion()
        {
            this.pnlMensajeValidacion.Visible = false;
            this.lblMensajeValidacion.Text = string.Empty;
        }

        protected override void MostrarMensaje(string mensaje, enmTipoMensajeMostrar tipoMensaje = enmTipoMensajeMostrar.Informativa)
        {
            this.pnlMensaje.Visible = true;
            this.lblMensaje.Text = mensaje;
            this.pnlMensaje.CssClass = this.ObtenerEstiloMensaje(tipoMensaje);
        }

        protected override void OcultarMensaje()
        {
            this.pnlMensaje.Visible = false;
            this.lblMensaje.Text = string.Empty;
        }

        #endregion

        protected override bool Validar(ref  StringBuilder sb)
        {
            bool retorno = true;
            try
            {
                //Valido las intersecciones
                using (var proxy = new SEEstructuraClient("BasicHttpBinding_ISEEstructura"))
                {
                    int resultInterseccion = proxy.ValidarInterseccionEstructura(int.Parse(this.hidCodigoSondaje.Value), int.Parse(this.hidCodigo.Value), double.Parse(this.txtDesde.Text), double.Parse(this.txtHasta.Text));
                    if (resultInterseccion == 1)
                    {
                        sb.AppendLine("Existen intersección en las estruturas.");
                        retorno = false;
                    }
                }
            }
            catch (Exception ex)
            {
                retorno = false;
                Logger.Error("frmEstructura:Validar", ex);
            }
            return retorno;
        }

        protected override void Guardar()
        {
            //base.Guardar();
            try
            {
                StringBuilder sb = new StringBuilder();
                if (!this.Validar(ref sb))
                {
                    this.MostrarMensajeValidacion(sb.ToString());
                    return;
                }

                Estructura estructura = new Estructura();
                estructura.CodigoSondaje = int.Parse(this.hidCodigoSondaje.Value);
                estructura.CodigoEstructura = int.Parse(this.hidCodigo.Value);
                estructura.Desde = double.Parse(this.txtDesde.Value.ToString());
                estructura.Hasta = double.Parse(this.txtHasta.Value.ToString());
                estructura.CodigoGeologo = int.Parse(this.ddlGeologo.SelectedValue.ToString());
                estructura.CodigoTipoEstructura = int.Parse(this.ddlEstructura.SelectedValue.ToString());
                //estructura.CodigoTipoRelleno = int.Parse(this.ddlRelleno.SelectedValue.ToString());
                estructura.Angulo = double.Parse(this.txtAngulo.Text);

                estructura.Fecha = (DateTime)this.txtFecha.SelectedDate;
                estructura.Descripcion = this.txtDescripcion.Text;

                //Agrega Estructura TipoRelleno
                List<EstructuraTipoRelleno> listaRelleno = new List<EstructuraTipoRelleno>();
                for (int i = 0; i < this.cboTipoRelleno.Items.Count; i++)
                {
                    if (this.cboTipoRelleno.Items[i].Checked == true)
                    {
                        EstructuraTipoRelleno esRelleno = new EstructuraTipoRelleno();
                        esRelleno.CodigoEstructura = estructura.CodigoEstructura;
                        esRelleno.CodigoSondaje = estructura.CodigoSondaje;
                        esRelleno.CodigoTipoRelleno = int.Parse(this.cboTipoRelleno.Items[i].Value);
                        esRelleno.Orden = i;
                        listaRelleno.Add(esRelleno);
                    }
                    estructura.EstructuraTipoRelleno = listaRelleno.ToArray();
                }

                string result = string.Empty;
                using (var proxy = new SEEstructuraClient("BasicHttpBinding_ISEEstructura"))
                {
                    if (this.hidCodigo.Value.CompareTo("0") == 0)

                        result = proxy.InsertarEstructura(estructura);

                    else

                        result = proxy.ModificarEstructura(estructura);
                }

                if (result.CompareTo("Registrado") != 0)
                {
                    MostrarMensajeValidacion(result);
                    return;
                }

                this.MostrarMensaje(MSG_OK_GRABAR);
                this.mpRegistro.Hide();
                Listar();
            }
            catch (Exception ex)
            {
                MostrarMensajeValidacion(MSG_ERROR_GRABAR);
                Logger.Error("frmEstructura:Guardar", ex);
            }
        }
        #endregion

        #region Eventos
        protected void rgLista_DeleteCommand(object sender, GridCommandEventArgs e)
        {
            try
            {
                string codigGeomecanica = ((GridDataItem)e.Item).GetDataKeyValue("CodigoEstructura").ToString();
                using (var proxy = new SEEstructuraClient("BasicHttpBinding_ISEEstructura"))
                {
                    proxy.EliminarEstructura(int.Parse(this.hidCodigoSondaje.Value), int.Parse(codigGeomecanica));
                }
                this.Listar();
                this.MostrarMensaje(MSG_OK_ELIMINAR);
            }
            catch (Exception ex)
            {
                this.MostrarMensaje(MSG_ERROR_ELIMINAR, enmTipoMensajeMostrar.Error);
                Logger.Error("frmEstructura:rgLista_DeleteCommand", ex);
            }
        }

        protected void imgClose_Click(object sender, ImageClickEventArgs e)
        {
            this.mpRegistro.Hide();
        }

        protected void rgLista_PageIndexChanged(object sender, GridPageChangedEventArgs e)
        {
            this.Listar();
        }

        protected void rgLista_PageSizeChanged(object sender, GridPageSizeChangedEventArgs e)
        {
            this.Listar();
        }

        protected void rgLista_SortCommand(object sender, GridSortCommandEventArgs e)
        {
            this.Listar();
        }

        protected void rgLista_ItemCommand(object sender, GridCommandEventArgs e)
        {
            if (e.CommandName.CompareTo("Editar") == 0)
            {
                var item = (GridEditableItem)e.Item;
                int codigoEstructura = int.Parse(item.GetDataKeyValue("CodigoEstructura").ToString());
                MostrarDetalle(codigoEstructura, enmAccionRealizar.Edicion);
            }

            if (e.CommandName.CompareTo("Ver") == 0)
            {
                //Ver solo lectura
                var item = (GridEditableItem)e.Item;
                int codigoEstructura = int.Parse(item.GetDataKeyValue("CodigoEstructura").ToString());
                MostrarDetalle(codigoEstructura, enmAccionRealizar.Ver);
            }

            if (e.CommandName == RadGrid.FilterCommandName)
            {
                Listar();
            }
        }

        protected void rgLista_ItemDataBound(object sender, GridItemEventArgs e)
        {
            try
            {
                if (e.Item.ItemType == GridItemType.Item || e.Item.ItemType == GridItemType.AlternatingItem)
                {
                    GridDataItem item = (GridDataItem)e.Item;
                    if (this.hidEstadoSondaje.Value.CompareTo(enmEstadoSondaje.Finalizado.GetHashCode().ToString()) == 0 |
                        this.hidCumplimiento.Value.CompareTo(enmEstadoCumplimiento.Cumplido.GetHashCode().ToString()) == 0)
                    {
                        ImageButton btnEliminar = (ImageButton)item["btnEliminar"].Controls[0];
                        btnEliminar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                        btnEliminar.Enabled = false;

                        ImageButton btnEditar = (ImageButton)item["btnEditar"].Controls[0];
                        btnEditar.ToolTip = BUTTON_TOOLTIP_DESHABILITADO;
                        btnEditar.Enabled = false;
                    }
                }
            }
            catch (Exception ex)
            {

                Logger.Error("frmEstructura:rgLista_ItemDataBound", ex);
            }
        }

        protected void ibtnExportar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                Listar();
                string alternateText = "ExcelML";
                this.rgLista.ExportSettings.Excel.Format = (GridExcelExportFormat)Enum.Parse(typeof(GridExcelExportFormat), alternateText);
                this.rgLista.ExportSettings.IgnorePaging = true;
                this.rgLista.ExportSettings.ExportOnlyData = true;
                this.rgLista.ExportSettings.OpenInNewWindow = true;
                this.rgLista.MasterTableView.ExportToExcel();
            }
            catch (Exception ex)
            {

                Logger.Error("frmEstructura:ibtnExportar_Click", ex);
            }
        }

        protected void ibtnRegistrar_Click(object sender, ImageClickEventArgs e)
        {
            MostrarDetalle(0, enmAccionRealizar.Nuevo);
        }

        protected void ibtnFinalizar_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                string result = string.Empty;
                using (var proxy = new SESondajeClient("BasicHttpBinding_ISESondaje"))
                {
                    result = proxy.FinalizarCumplimiento(int.Parse(this.hidCodigoSondaje.Value), enmTipoAnalisis.Estructura.GetHashCode());
                }
                if (result.CompareTo("Cumplido") != 0)
                    MostrarMensaje(result, enmTipoMensajeMostrar.Error);
                else
                    MostrarMensaje(result);
                CargarSondaje();
                Listar();
            }
            catch (Exception ex)
            {
                MostrarMensaje(MSG_ERROR_GENERICO, enmTipoMensajeMostrar.Error);
                Logger.Error("frmEstructura:ibtnFinalizar_Click", ex);
            }
        }

        protected void ibtnGuardar_Click(object sender, ImageClickEventArgs e)
        {
            Guardar();
        }

        protected void ibtnCancelar_Click(object sender, ImageClickEventArgs e)
        {
            this.mpRegistro.Hide();
        }

        #endregion
    }
}